package com.novel.service;


import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.novel.common.enums.AccountStatusEnum;
import com.novel.common.enums.UserIdentifyEnum;
import com.novel.mapper.RoleMapper;
import com.novel.mapper.UserMapper;
import com.novel.common.exception.CustomerException;
import com.novel.pojo.system.Role;
import com.novel.pojo.system.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
@Transactional
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RoleMapper roleMapper;


    /**
     * 更换用户头像信息
     */
    public  boolean updateUserImgSrc(String imgSrc, User old) {
        User now = userMapper.selectByPrimaryKey(old.getUserId());

        if (!now.equals(old)) {
            throw new CustomerException("信息有其他改动，请重试!");
        }

        now.setImgSrc(imgSrc);
        return userMapper.updateByPrimaryKey(now) == 1;
    }

    /**
     * 给所有用户送推荐票数
     */
    @Transactional
    public boolean sendAllUserRecommend(Integer addRecommend) {
        //封装查询条件
        Example example = new Example(User.class);
        example.selectProperties("userId");
        //获取用户id集合
        List<String> userIds = userMapper.selectByExample(example).stream().map(User::getUserId).collect(Collectors.toList());
        return userMapper.updateUserRecommendByUserId(userIds, addRecommend) == userIds.size();
    }

    /**
     * 增加用户推荐票数
     */
    @Transactional
    public boolean addUserRecommend(List<String> userIds, Integer addRecommend) {
        return userMapper.updateUserRecommendByUserId(userIds, addRecommend) == userIds.size();
    }

    /**
     * 实时获取用户信息
     */
    public User getUserInfo(String userId) {
        return userMapper.selectByPrimaryKey(userId);
    }


    /**
     * 用户登录
     * 只能通过邮箱登录
     *
     * @param email    邮箱
     * @param password 密码
     * @return null/数据 如果登录成功返回查询到的用户信息
     */
    public User Login(String email, String password) {
        //查询用户信息
        User user = userMapper.selectByEmail(email);
        //判断用户是否存在
        if (user == null) {
            //用户不存在
            throw new CustomerException("账号不存在");
        }
        //判断账号状态是否可以登录
        if (AccountStatusEnum.NORMAL.getCode() != user.getStatus()) {
            throw new CustomerException("账号处于封禁状态中,无法登录");
        }
        //判断密码是否输入正确
        if (!user.getPassword().equals(password)) {
            //密码输入错误
            throw new CustomerException("密码错误！");
        }
        //返回查询到的用户信息
        return user;
    }

    /**
     * 用户登录
     *
     * @param email 邮箱
     */
    public User LoginByEmail(String email) {
        User user = new User();
        user.setUserEmail(email);

        User result = userMapper.selectOne(user);
        if (result == null) {
            //用户不存在
            throw new CustomerException("账号不存在");
        }
        //判断账号状态是否可以登录
        if (AccountStatusEnum.NORMAL.getCode() != user.getStatus()) {
            throw new CustomerException("账号处于封禁状态中,无法登录");
        }
        return result;
    }

    /**
     * 用户注册
     * 邮箱、用户密码、用户的网名是必须填的
     *
     * @param user 封装以上信息
     * @return true/false
     */
    public boolean Register(User user) {
        //判断传入的邮箱是否重复
        User data = userMapper.selectByEmail(user.getUserEmail());
        if (data != null) {
            //传入的邮箱已经存在，无法注册
            throw new CustomerException("该账号已经被注册");
        }
        //添加用户id
        user.setUserId(UUID.randomUUID().toString());
        //添加注册时间
        user.setCreateTime(new Date());
        //设置账户余额
        user.setAmount(0.0);
        //设置推荐票数
        user.setRecommend(3);
        //设置不是管理员
        user.setIdentify(UserIdentifyEnum.READER.getCode());
        //设置用户生日
        user.setBirthday(new Date());
        if (userMapper.insert(user) == 1) {
            //查询角色信息
            List<Role> roleList = roleMapper.selectAll();
            String roleId = "";
            for (Role role : roleList) {
                if (role.getRoleName().equals("普通用户")) {
                    roleId = role.getRoleId();
                }
            }
            //给新用户分配角色
            roleMapper.addRoleByUserId(user.getUserId(), roleId);
            return true;
        }
        return false;
    }

    /**
     * 修改密码,通过邮箱仅更新密码
     * 用于定期修改、忘记密码的时候修改
     * 定期修改验证当前登录密码
     * 忘记密码验证邮箱
     *
     * @param user user对象封装数据
     * @return true/false
     */
    public boolean ChangePasswordByEmail(User user) {
        return userMapper.updatePasswordByEmail(user) == 1;
    }

    /**
     * 修改密码
     * 用于定期修改、忘记密码的时候修改
     * 定期修改验证当前登录密码
     * 忘记密码验证邮箱
     *
     * @param user user对象封装数据
     * @return true/false
     */
    public boolean ChangePassword(User user) {
        return userMapper.updateByPrimaryKeySelective(user) == 1;
    }

    /**
     * 注销账号
     * 如果是登录状态需要验证密码
     * 如果是非登录状态，需要验证邮箱
     *
     * @param userId 用户id，唯一标识
     * @return true/false
     */
    public boolean CancelAccount(String userId) {
        return userMapper.deleteByPrimaryKey(userId) == 1;
    }

    /**
     * 修改用户个人信息
     *
     * @param user 用户信息封装
     */
    public boolean ChangePersonal(User user) {
        return userMapper.updateByPrimaryKeySelective(user) == 1;
    }

    /**
     * @param pageNum  当前页号
     * @param pageSize 页大小
     */
    public PageInfo<User> findAllUser(Integer pageNum, Integer pageSize) {
        //设置分页数据
        PageHelper.startPage(pageNum, pageSize);
        //查询数据
        List<User> userList = userMapper.selectAll();
        //封装数据返回
        return new PageInfo<>(userList);
    }
}
